[アップデート] AWS Transfer Family が Active Directory 認証をサポートしました
しばたです。
少し前の話ですがAWS Transfer FamilyのIDプロバイダーにActive Directory環境を指定できる様になりました。
AWSからのアナウンスはこちらになります。
この更新により
- AWS Managed Microsoft AD
- AD Connector経由のActive Directory環境 (オンプレAD、EC2 AD)
のユーザー情報をAWS Transfer Familyの認証に使うことができる様になりました。
試してみた
細かい説明より実際に試してみるのが手っ取り早いと思うので早速試してみます。
0. 事前準備
今回はAWS Managed Microsoft ADで試します。
全体像としてはざっくり下図のイメージです。
事前準備としてAWS Managed Microsoft ADを配備するVPC環境とAWS Transfer Familyで使用するS3とその権限周りのリソースは予め作成済みの状態からスタートします。
- VPC環境
- AWS Managed Microsoft ADを操作するためのEC2インスタンス
- AWS Transfer Family用S3 (
transfer-family-test-20210613
)- 上記S3へのフルアクセス権を持ったIAMロール (
transfer-family-test-role
)
- 上記S3へのフルアクセス権を持ったIAMロール (
1. AWS Managed Microsoft ADの準備
まずはActive Directory側の準備を行います。
予め用意しておいたVPC環境にcorp.contoso.com
ドメインを作成しておきます。
ドメイン環境の作成方法はなんでも良いですがAWS Tools for PowerShellを使うとこんな感じで作成できます。
# AWS Tools for PowerShell 4.1.13.0 で corp.contoso.com ドメインを作成
Import-Module AWS.Tools.DirectoryService
$params = @{
VpcSettings_VpcId = '<your vpc id>'
VpcSettings_SubnetId = ('<subnet id1>', '<subnet id2>')
Edition = 'Standard'
Name = 'corp.contoso.com'
ShortName = 'CORP'
Password = 'P@ssw0rd'
}
New-DSMicrosoftAD @params
そして、AWS Transfer FamilyではActive Directoryのグループ単位で認証情報を紐づけます。
このためドメインに任意のユーザーとグループを用意しておいてください。
今回は以下の様なスクリプトを使いTransfer Family Users
グループとtransfer-user01
、transfer-user02
ユーザーを用意しておきます。
# Active Directoryに接続できる環境からスクリプトでグループとユーザーを作成
Import-Module ActiveDirectory
# グループ追加
$params = @{
Name = 'Transfer Family Users'
Description = 'Transfer Family Users'
GroupCategory = 'Security'
GroupScope = 'Global'
}
New-ADGroup @params
# ユーザー追加
'transfer-user01', 'transfer-user02' | ForEach-Object {
# ユーザー作成
$params = @{
Name = $_;
Description = 'Transfer Family User';
AccountPassword = ConvertTo-SecureString 'P@ssw0rd' -AsPlainText -Force;
PasswordNeverExpires = $true;
Enabled = $true;
}
New-ADUser @Params
# グループ参加
Add-ADGroupMember -Identity 'Transfer Family Users' -Members $_
}
そしてAWS Transfer Familyの構築時にこのグループのSIDが必要になるので、以下のコマンドでSIDを記録しておきます。
# AWS Transfer Family では連動するグループのSID(ObjectSid)が必要
Get-ADGroup -Filter {samAccountName -like 'Transfer Family User*'} -Properties * |
Select-Object SamAccountName, ObjectSid
今回の環境だとS-1-5-21-1691862169-3619929625-2679959637-2111
がSIDになります。
PS C:\Users\admin> Get-ADGroup -Filter {samAccountName -like 'Transfer Family User*'} -Properties * |
>> Select-Object SamAccountName, ObjectSid
SamAccountName ObjectSid
-------------- ---------
Transfer Family Users S-1-5-21-1691862169-3619929625-2679959637-2111
もしスクリプトの実行が難しい場合はADSIエディタから当該グループのobjectSid
属性を参照してください。
2. AWS Transfer Familyの作成
これで前準備ができましたのでここから本題であるAWS Transfer Familyを作成していきます。
今回はシンプルに、
- プロトコルはSFTPのみサポート
- エンドポイントの種類はパブリックアクセス
の構成とします。
AWS Transfer Familyのマネジメントコンソールから「サーバーの作成」を選び
今回は「SFTP」のみ有効にして「次へ」
IDプロバイダーに「Active Direcotry Serivce」が増えているので選択し、ディレクトリに先ほど作成した「CORP (corp.contoso.com)」を選びます。
エンドポイントの種類は「パブリックアクセス」可能とし「次へ」
ストレージの種類は「Amazon S3」を選び「次へ」
その他の設定は基本デフォルトのまま「次へ」
最後に設定内容に間違いが無いことを確認して「サーバーを作成」をクリック。
あとはSFTPサーバーが作成されるので完成するまで待ちます。
3. AWS Transfer Familyのアクセス権設定
SFTPサーバーの作成が完了すると下図の様になり「まだアクセス権が無い」旨の警告を表示してくれます。
このため当該サーバーを選択し「アクセスの追加」をしてやります。
アクセス権の追加画面では下図の様に認証に使用するActive DirectoryグループのSIDを指定する必要があるので、前節で取得した値を指定してやります。
その他の項目については従来通り必要な権限と対象のS3バケットを指定してください。
(今回は確認用にホームディレクトリの「制限付き」を解除しています)
アクセス権の設定ができればこれで完了です。
4. 接続テスト
実際に接続する前に接続テストを行います。
前節で作成したユーザーtransfer-user01
とパスワードを設定しテストします。
成功すると下図の様に StatusCode = 200 とレスポンスメッセージを返します。
ここでエラーとなる場合は適宜必要な対処を行ってください。
5. 接続確認
それでは実際にSFTPサーバーに接続確認を行います。
今回はsftpコマンドで接続してみます。
接続時のユーザー情報は<ユーザー名>@<ドメイン名>
を指定してやる必要があるため、sftpコマンドの接続文字列してはsftp <ユーザー名>@<ドメイン名>@<エンドポイント名>
と指定する必要があります。
# sftp <ユーザー名>@<ドメイン名>@<エンドポイント名> の形式で接続
sftp transfer-user01@corp.contoso.com@s-xxxxxxxxxx.server.transfer.ap-northeast-1.amazonaws.com
あとは一般的なSFTPサーバーと同様に扱ってください。
上図の例の通りホームディレクトリ/transfer-family-test-20210613/transfer-user01
に接続し、テストデータ(KEN_ALL.CSV
)をいい感じにアップロードできています。
S3にもちゃんと反映されています。
最後に
以上となります。
既存の認証基盤にActive Directoryを使っている環境は多いと思います。
今回の更新でActive Directoryの認証情報を非常にお手軽に連携することができる様になりましたのでぜひ試してみてください。